﻿using System;
using System.Collections.Generic;
using System.Data;
using ObjetoNegocio;

namespace Banco
{
    public class AtributoBD:BancoAbstrato<Atributo>
    {
        private Atributo _corrente;
        private Atributo Corrente
        {
            get
            {
                if (_corrente == null)
                {
                    _corrente = new Atributo();
                }
                return _corrente;
            }
            set
            {
                _corrente = value;
            }
        }
       
        public override bool Remover(Atributo atributo)
        {
            throw new System.NotImplementedException();
        }

        public override bool Atualizar(Atributo atributo)
        {
            throw new System.NotImplementedException();
        }

        public override List<Atributo> ListarPorFiltro(Atributo atributo)
        {
            ComandoSql("[dbo].[cons_TBL_AtributoPorFiltro]", CommandType.StoredProcedure);
            AdicionarParametroNulo("@codigo", atributo.Codigo);
            AdicionarParametroNulo("@nome", atributo.Nome);
            AdicionarParametroNulo("@descricao", atributo.Descricao);
            return ExecutarConsultarListagem();
        }


        public List<Atributo> ListarPorBusca(Busca busca)
        {
            ComandoSql("[dbo].[cons_TBL_Busca_Atributo]", CommandType.StoredProcedure);
            AdicionarParametroNulo("@codBusca", busca.Codigo);
            AdicionarParametroNulo("@codUsuario", busca.Usuario.Codigo);
            return ExecutarConsultarListagem();
        }

        public List<Atributo> ListarPorAlgoritmo(Algoritmo algoritmo)
        {
            ComandoSql("[dbo].[cons_TBL_Algoritmo_Atributo]", CommandType.StoredProcedure);
            AdicionarParametroNulo("@codAlgoritmo", algoritmo.Codigo);
            return ExecutarConsultarListagem();
        }

        public override Atributo Pesquisar(Atributo atributo)
        {
            ComandoSql("[dbo].[cons_TBL_AtributoPorFiltro]", CommandType.StoredProcedure);
            AdicionarParametroNulo("@codigo", atributo.Codigo);
            AdicionarParametroNulo("@nome", atributo.Nome);
            AdicionarParametroNulo("@descricao", atributo.Descricao);
            return ExecutarConsultaObjeto();
        }

        public override void Inserir(Atributo atributo)
        {
            decimal codigo;
            ComandoSql("[dbo].[ins_TBL_Atributo]", CommandType.StoredProcedure);
            AdicionarParametro("@codigo", atributo.Codigo, true);
            AdicionarParametro("@nome", atributo.Nome);
            AdicionarParametroNulo("@descricao", atributo.Descricao);
            ExecutarComando(out codigo);
            atributo.Codigo = codigo;
        }

        public override bool Existe(Atributo atributo)
        {
            throw new System.NotImplementedException();
        }

        protected override void MontarObjeto(ref Atributo atributo, IDataReader reader)
        {
            var valorBD = new ValorBD();

            if (reader["CODIGO_ATRIBUTO"] != DBNull.Value)
            {
                var codigoAtributo = (decimal)reader["CODIGO_ATRIBUTO"];
                
                if (Corrente.Codigo != codigoAtributo)
                {
                    Corrente = new Atributo();
                    Corrente.Codigo = codigoAtributo;
                    Corrente.Valores = new List<Valor>();
                    
                    if (reader["DESCRICAO_ATRIBUTO"] != DBNull.Value)
                    {
                        Corrente.Descricao = reader["DESCRICAO_ATRIBUTO"].ToString();
                    }

                    if (reader["NOME_ATRIBUTO"] != DBNull.Value)
                    {
                        Corrente.Nome = reader["NOME_ATRIBUTO"].ToString();
                    }

                    if (reader["CODIGO_VALOR"] != DBNull.Value)
                    {
                        var codigo = Convert.ToDecimal(reader["CODIGO_VALOR"]);
                        Corrente.Valores.Add(valorBD.Pesquisar(new Valor { Codigo = codigo }));
                    }
                }
                else
                {
                    if (reader["CODIGO_VALOR"] != DBNull.Value)
                    {
                        var codigo = Convert.ToDecimal(reader["CODIGO_VALOR"]);
                        Corrente.Valores.Add(valorBD.Pesquisar(new Valor { Codigo = codigo }));
                    }
                }
                atributo = Corrente;
            }
        }
    }
}
